﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using BadgeManager.Model;

namespace BadgeManager.Controller
{
    public class ctrlDocenze
    {
        private Connector Connessione;

        public enum Insert
        {
            ok,
            ko
        }

        public enum Update
        {
            ok,
            ko
        }

        public enum Delete
        {
            ok,
            ko
        }

        public enum DocenteAssociato
        {
            si,
            no,
            nulla
        }

        public enum Response
        {
            ok,
            ko
        }

        public ctrlDocenze()
        {
            Connessione = Connector.Istance();
        }

        /// <summary>
        /// Controlla se esiste già un docente su un attivita nella tabella
        /// </summary>
        /// <param name="Docenza"></param>
        /// <returns></returns>
        public bool DocenteGiaEsistente(Docenze Docenza)
        {
            string sql = @"select iddocente,idattivita from Docenze
                    where iddocente=@iddocente and idattivita=@idattivita";
            SqlCommand cmd = new SqlCommand(sql, Connessione.Connessione);
            cmd.Parameters.AddWithValue("@iddocente", (Guid)Docenza.Docente.Id);
            cmd.Parameters.AddWithValue("@idattivita", (Guid)Docenza.Attivita.Id);
            Guid risultato = (Guid)cmd.ExecuteScalar();
            if (risultato != null)
                return true;
            else
                return false;
        }

        /// <summary>
        /// Conta il numero di docenti presenti in un attivita
        /// </summary>
        /// <param name="Attivita"></param>
        /// <returns></returns>
        public int ContaDocentiInAttivita(Attivita Attivita)
        {
            string sql = @"select count(*)as conteggio from Docenze
                    where idattivita=@idattivita where iddocente is not null";
            SqlCommand cmd = new SqlCommand(sql, Connessione.Connessione);
            cmd.Parameters.AddWithValue("@idattivita", (Guid)Attivita.Id);
            return (int)cmd.ExecuteScalar();
        }

        /// <summary>
        /// Inserisce una nuova docenza
        /// </summary>
        /// <param name="Docenza"></param>
        /// <returns></returns>
        public Insert Nuovo(Docenze Docenza)
        {
            string sql = @"insert into Docenze
                (@id,@iddocente,@idattivita)";
            SqlCommand cmd = new SqlCommand(sql, Connessione.Connessione);
            cmd.Parameters.AddWithValue("@id", (Guid)Docenza.Id);
            cmd.Parameters.AddWithValue("@iddocente", (Guid)Docenza.Docente.Id);
            cmd.Parameters.AddWithValue("@idattivita", (Guid)Docenza.Attivita.Id);
            if (cmd.ExecuteNonQuery() > 0)
                return Insert.ok;
            else
                return Insert.ko;
        }

        /// <summary>
        /// Modifica una riga della tabella docenza by Id
        /// </summary>
        /// <param name="Docenza"></param>
        /// <returns></returns>
        public Update Modifica(Docenze Docenza)
        {
            string sql = @"update Docenze set
                iddocente=@iddocente,idattivita=@idattivita
                where id=@id";
            SqlCommand cmd = new SqlCommand(sql, Connessione.Connessione);
            cmd.Parameters.AddWithValue("@id", (Guid)Docenza.Id);
            cmd.Parameters.AddWithValue("@iddocente", (Guid)Docenza.Docente.Id);
            cmd.Parameters.AddWithValue("@idattivita", (Guid)Docenza.Attivita.Id);
            if (cmd.ExecuteNonQuery() > 0)
                return Update.ok;
            else
                return Update.ko;
        }

        /// <summary>
        /// Cancella una riga della tabella docenza by Id
        /// </summary>
        /// <param name="Docenza"></param>
        /// <returns></returns>
        public Delete Cancella(Docenze Docenza)
        {
            string sql = @"delete from Docenze
                where id=@id";
            SqlCommand cmd = new SqlCommand(sql, Connessione.Connessione);
            cmd.Parameters.AddWithValue("@id", (Guid)Docenza.Id);
            if (cmd.ExecuteNonQuery() > 0)
                return Delete.ok;
            else
                return Delete.ko;
        }

        /// <summary>
        /// Seleziona tutte le righe da tabella Docenze
        /// </summary>
        /// <returns></returns>
        public List<Docenze> SelezionaTutto()
        {
            string sql = @"SELECT Docenze.id AS IdDocenze, Docenze.iddocente AS IdDocente, Persone.nome AS Nome, Persone.cognome AS Cognome, Docenze.idattivita AS IdAttivita,
                Attivita.descrizione AS Descrizione,Corsi.id as IdCorso, Corsi.nome AS Corso
                FROM Docenti INNER JOIN
                    Docenze INNER JOIN
                    Corsi INNER JOIN
                    Attivita ON Corsi.id = Attivita.idcorso ON Docenze.idattivita = Attivita.id ON Docenti.id = Docenze.iddocente INNER JOIN
                    Persone ON Docenti.id = Persone.id";
            SqlDataAdapter com = new SqlDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            if (dt.Rows.Count == 0) { return null; }
            List<Docenze> Docenze = new List<Docenze>();
            foreach (DataRow item in dt.Rows)
            {
                Docenze Docenza = new Docenze();
                Docenza.Docente.Id = (Guid)item["IdDocente"];
                Docenza.Docente.Nome = item["Nome"].ToString();
                Docenza.Docente.Cognome = item["Cognome"].ToString();
                Docenza.Attivita.Id = (Guid)item["IdAttivita"];
                Docenza.Attivita.Descrizione = item["Descrizione"].ToString();
                Docenza.Attivita.Corso.Id = (Guid)item["IdCorso"];
                Docenza.Attivita.Corso.Nome = item["Corso"].ToString();

                Docenze.Add(Docenza);
            }
            return Docenze;
        }

        /// <summary>
        /// Seleziona tutti i docenti non impegnati in un attivita
        /// </summary>
        /// <param name="Attivita"></param>
        /// <returns></returns>
        public List<Docente> SelezionaDocentiNonImpegnati()
        {
            string sql = @"SELECT Attivita.id AS IdAttivita, Persone.nome AS Nome, Persone.cognome AS Cognome, Docenti.id AS IdDocente, Persone.idattivita AS IdAttivitaPersona
                FROM Persone INNER JOIN
                    Attivita ON Persone.idattivita = Attivita.id INNER JOIN
                    Stanze ON Attivita.idstanza = Stanze.id RIGHT OUTER JOIN
                    Docenti ON Persone.id = Docenti.id
                WHERE (Persone.idattivita IS NULL) ORDER BY Persone.cognome ASC";

            SqlDataAdapter com = new SqlDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            if (dt.Rows.Count == 0) { return null; }
            List<Docente> Docenti = new List<Docente>();
            foreach (DataRow item in dt.Rows)
            {
                Docente Docente = new Docente();
                Docente.Id = (Guid)item["IdDocente"];
                Docente.Nome = item["Nome"].ToString();
                Docente.Cognome = item["Cognome"].ToString();
                Docenti.Add(Docente);
            }
            return Docenti;
        }

        /// <summary>
        /// Seleziona tutti i docenti impegnati in un attivita
        /// </summary>
        /// <param name="Attivita"></param>
        /// <returns></returns>
        public List<Docente> SelezionaDocentiImpegnati(Attivita Attivita)
        {
            string sql = @"SELECT Attivita.id AS IdAttivita, Persone.nome AS Nome, Persone.cognome AS Cognome, Docenti.id AS IdDocente, Persone.idattivita AS IdAttivitaPersona
                FROM Persone INNER JOIN
                    Attivita ON Persone.idattivita = Attivita.id INNER JOIN
                    Stanze ON Attivita.idstanza = Stanze.id RIGHT OUTER JOIN
                    Docenti ON Persone.id = Docenti.id
                WHERE (Attivita.id = '" + Attivita.Id + "') AND (Persone.idattivita IS NOT NULL) ORDER BY Persone.cognome ASC";

            SqlDataAdapter com = new SqlDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            if (dt.Rows.Count == 0) { return null; }
            List<Docente> Docenti = new List<Docente>();
            foreach (DataRow item in dt.Rows)
            {
                Docente Docente = new Docente();
                Docente.Id = (Guid)item["IdDocente"];
                Docente.Nome = item["Nome"].ToString();
                Docente.Cognome = item["Cognome"].ToString();
                Docenti.Add(Docente);
            }
            return Docenti;
        }

        /// <summary>
        /// Toglie un docente da un attività
        /// </summary>
        /// <param name="Docente"></param>
        /// <param name="Attivita"></param>
        /// <returns></returns>
        public Response TogliDocenteDaAttivita(Docente Docente, Attivita Attivita)
        {
            string sql = @"update Docenze set
                iddocente=NULL where (idattivita=@idattivita and iddocente=@iddocente)";
            SqlCommand cmd = new SqlCommand(sql, Connessione.Connessione);
            cmd.Parameters.AddWithValue("@idattivita", (Guid)Attivita.Id);
            cmd.Parameters.AddWithValue("@iddocente", (Guid)Docente.Id);
            if (cmd.ExecuteNonQuery() > 0)
                return Response.ok;
            else
                return Response.ko;
        }

        /// <summary>
        /// Controlla se la persona passata è un docente
        /// </summary>
        /// <param name="Persona"></param>
        /// <returns></returns>
        public bool IsDocente(Persona Persona)
        {
            string sql = @"SELECT Persone.id
                FROM Persone RIGHT OUTER JOIN
                    Docenti ON Persone.id = Docenti.id
                WHERE (Persone.id = @idpersona)";
            SqlCommand cmd = new SqlCommand(sql, Connessione.Connessione);
            cmd.Parameters.AddWithValue("@idpersona", (Guid)Persona.Id);
            Guid idpersona = (Guid)cmd.ExecuteScalar();
            if (idpersona != null)
                return true;
            else
                return false;
        }

        /// <summary>
        /// Controlla che un docente sia associato ad un'attività valida
        /// </summary>
        /// <param name="Attivita"></param>
        /// <returns></returns>
        public DocenteAssociato DocenteAssociatoAdAttivitaInCorso(Docente Docente)
        {
            string sql = @"SELECT Docenti.id AS IdDocente,Corsi.datafine AS DataFine
                FROM Docenti INNER JOIN
                    Persone ON Persone.id = Docenti.id INNER JOIN
                    Attivita ON Attivita.id = Persone.idattivita INNER JOIN
                    Corsi ON Attivita.idcorso = Corsi.id
                WHERE (Corsi.datafine IS NOT NULL) AND (Docenti.id = @iddocente)";
            SqlCommand cmd = new SqlCommand(sql, Connessione.Connessione);
            cmd.Parameters.AddWithValue("@iddocente", (Guid)Docente.Id);
            Guid iddocente = (Guid)cmd.ExecuteScalar();
            if (iddocente != null)
                return DocenteAssociato.si;
            else
                return DocenteAssociato.no;
        }
    }
}